﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StockSharp.BusinessEntities;
using StockSharp.AlfaDirect.Tables;

namespace StockSharp.AlfaDirect
{
    internal interface IAlfaWrapper
	{
        /// <summary>
        /// Возвращает текущую версию COM объекта Альфа Директ.
        /// </summary>
        string Version { get; }
        /// <summary>
        /// Возвращает состояние подключения к серверу АльфаДирект. Подключены или не подключены.
        /// </summary>
        bool IsConnected { get; }
        /// <summary>
        /// Возвращает текущее рыночное время с сервера АльфаДирект
        /// </summary>
        DateTime MarketTime { get; }


        /// <summary>
        /// Таблица Ордеров
        /// </summary>
        AdTable TblOrders { get; }
        /// <summary>
        /// Таблица Портфелей и Позиций
        /// </summary>
        AdTable TblBalance { get; }
        /// <summary>
        /// Таблица сделок по инструментам.
        /// </summary>
        AdTable TblAllTrades { get; }
        /// <summary>
        /// Таблица Собственных сделок
        /// </summary>
        AdTable TblMyTrades { get; }
        /// <summary>
        /// Таблица Стакана
        /// </summary>
        AdQueueTable TblQueue { get; }
        /// <summary>
        /// Таблица Котировок инструментов.
        /// </summary>
        AdTable TblFinInfo { get; }
        /// <summary>
        /// Таблица Справочник финансовых инструментов.
        /// </summary>
        AdTable TblPapers { get; }
        /// <summary>
        /// Таблица Справочник рынков.
        /// </summary>
        AdTable TblTradePlaces { get; }


        /// <summary>
        /// Событие вызываемое когда терминал подключился к серверу Альфы
        /// </summary>
        event Action ConnectedEvent;
        /// <summary>
        /// Событие вызываемое когда терминал отключился от сервера Альфы.
        /// </summary>
        event Action DisconnectedEvent;
        /// <summary>
        /// Событие вызываемое при ошибке подключения терминала к серверу Альфы.
        /// </summary>
        event Action<Exception> ConnectionErrorEvent;
        /// <summary>
        /// Событие вызываемое при любом получении новых данных от Альфа терминала.
        /// </summary>
        event Action NewDataExportedEvent;


        /// <summary>
        /// Производит подключение к серверу Альфы. Если логин и пароль не заданы, то ничего не делает.
        /// </summary>
        /// <param name="login">Логин.</param>
        /// <param name="password">Пароль.</param>
        void Connect(string login, string password);
        /// <summary>
        /// Отключает от сервера Альфы
        /// </summary>
        void Disconnect();


        /// <summary>
        /// Создать лимитированную заявку.
        /// </summary>
        /// <param name="order"></param>
        void CreateLimitOrder(Order order);
        /// <summary>
        /// Перерегистрировать лимитированную заявку. То есть изменить параметры заявки.
        /// </summary>
        /// <param name="oldOrder"></param>
        /// <param name="newOrder"></param>
        void UpdateLimitOrder(Order oldOrder, Order newOrder);
        
        /// <summary>
        /// Создать стоп заявку.
        /// </summary>
        /// <param name="order"></param>
        void CreateStopOrder(Order order);
        /// <summary>
        /// Перерегистрировать стоп заявку. То есть обновить параметры заявки.
        /// </summary>
        /// <param name="oldOrder"></param>
        /// <param name="newOrder"></param>
        void UpdateStopOrder(Order oldOrder, Order newOrder);
        
        /// <summary>
        /// Создать следящую заявку.
        /// </summary>
        /// <param name="order"></param>
        void CreateTrailingOrder(Order order);
        /// <summary>
        /// Перерегистрировать следящую заявку. То есть изменить параметры заявки.
        /// </summary>
        /// <param name="oldOrder"></param>
        /// <param name="newOrder"></param>
        void UpdateTrailingOrder(Order oldOrder, Order newOrder);
        
        /// <summary>
        /// Отменить конкретную заявку. Отмена происходит по ID заявки.
        /// </summary>
        /// <param name="order"></param>
        void CancelOrder(Order order);

	} 
}

